package com.example.smartagrisys.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.smartagrisys.common.Result;
import com.example.smartagrisys.entity.Product;
import com.example.smartagrisys.entity.User;
import com.example.smartagrisys.service.OrderItemService;
import com.example.smartagrisys.service.ProductService;
import com.example.smartagrisys.service.UserService;
import com.example.smartagrisys.util.SecurityUtil;
import com.example.smartagrisys.vo.ProductVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 产品控制器
 */
@Slf4j
@RestController
@RequestMapping("/product")
public class ProductController {

    @Autowired
    private ProductService productService;
    
    @Autowired
    private UserService userService;

    @Autowired
    private OrderItemService orderItemService;

    /**
     * 分页获取产品列表
     *
     * @param current 当前页
     * @param size 每页条数
     * @param product 查询条件
     * @return 分页结果
     */
    @GetMapping("/page")
    public Result<Page<Product>> getProductPage(
            @RequestParam(defaultValue = "1") Integer current,
            @RequestParam(defaultValue = "10") Integer size,
            Product product) {
        Page<Product> page = new Page<>(current, size);
        Page<Product> result = productService.getProductPage(page, product);
        return Result.success(result);
    }

    /**
     * 获取产品详情
     *
     * @param id 产品ID
     * @return 产品详情
     */
    @GetMapping("/{id}")
    public Result<Product> getProductById(@PathVariable Long id) {
        Product product = productService.getProductById(id);
        if (product == null) {
            return Result.error("产品不存在");
        }
        return Result.success(product);
    }

    /**
     * 获取农户自己的产品列表
     *
     * @return 产品列表
     */
    @GetMapping("/my")
    public Result<List<Product>> getMyProducts() {
        // 获取当前登录用户
        Long userId = SecurityUtil.getCurrentUserId();
        if (userId == null) {
            return Result.error("用户未登录");
        }
        
        List<Product> products = productService.getProductsByFarmerId(userId);
        return Result.success(products);
    }

    /**
     * 添加产品
     *
     * @param product 产品信息
     * @return 添加结果
     */
    @PostMapping
    public Result<Boolean> addProduct(@RequestBody Product product) {
        // 获取当前登录用户
        Long userId = SecurityUtil.getCurrentUserId();
        if (userId == null) {
            return Result.error("用户未登录");
        }
        
        // 设置农户信息
        User user = userService.getById(userId);
        product.setFarmerId(userId);
        product.setFarmerName(user.getUsername());
        
        // 初始状态为下架
        product.setStatus(0);
        product.setCreateTime(LocalDateTime.now());
        product.setUpdateTime(LocalDateTime.now());
        
        boolean result = productService.addProduct(product);
        if (!result) {
            return Result.error("添加产品失败");
        }
        return Result.success(true);
    }

    /**
     * 更新产品
     *
     * @param product 产品信息
     * @return 更新结果
     */
    @PutMapping
    public Result<Boolean> updateProduct(@RequestBody Product product) {
        // 获取当前登录用户
        Long userId = SecurityUtil.getCurrentUserId();
        if (userId == null) {
            return Result.error("用户未登录");
        }
        
        // 验证是否是自己的产品
        Product existingProduct = productService.getById(product.getId());
        if (existingProduct == null) {
            return Result.error("产品不存在");
        }
        
        if (!existingProduct.getFarmerId().equals(userId)) {
            return Result.error("无权操作此产品");
        }
        
        product.setUpdateTime(LocalDateTime.now());
        
        boolean result = productService.updateProduct(product);
        if (!result) {
            return Result.error("更新产品失败");
        }
        return Result.success(true);
    }

    /**
     * 删除产品
     *
     * @param id 产品ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    public Result<Boolean> deleteProduct(@PathVariable Long id) {
        // 获取当前登录用户
        Long userId = SecurityUtil.getCurrentUserId();
        if (userId == null) {
            return Result.error("用户未登录");
        }
        
        // 验证是否是自己的产品
        Product existingProduct = productService.getById(id);
        if (existingProduct == null) {
            return Result.error("产品不存在");
        }
        
        if (!existingProduct.getFarmerId().equals(userId)) {
            return Result.error("无权操作此产品");
        }
        
        boolean result = productService.deleteProduct(id);
        if (!result) {
            return Result.error("删除产品失败");
        }
        return Result.success(true);
    }

    /**
     * 上传产品图片
     *
     * @param file 图片文件
     * @return 图片URL
     */
    @PostMapping("/upload/image")
    public Result<String> uploadProductImage(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return Result.error("上传文件不能为空");
        }
        
        String imageUrl = productService.uploadProductImage(file);
        if (imageUrl == null) {
            return Result.error("上传图片失败");
        }
        return Result.success(imageUrl);
    }

    /**
     * 上架产品
     *
     * @param id 产品ID
     * @return 上架结果
     */
    @PutMapping("/publish/{id}")
    public Result<Boolean> publishProduct(@PathVariable Long id) {
        // 获取当前登录用户
        Long userId = SecurityUtil.getCurrentUserId();
        if (userId == null) {
            return Result.error("用户未登录");
        }
        
        // 验证是否是自己的产品
        Product existingProduct = productService.getById(id);
        if (existingProduct == null) {
            return Result.error("产品不存在");
        }
        
        if (!existingProduct.getFarmerId().equals(userId)) {
            return Result.error("无权操作此产品");
        }
        
        boolean result = productService.publishProduct(id);
        if (!result) {
            return Result.error("上架产品失败");
        }
        return Result.success(true);
    }

    /**
     * 下架产品
     *
     * @param id 产品ID
     * @return 下架结果
     */
    @PutMapping("/unpublish/{id}")
    public Result<Boolean> unpublishProduct(@PathVariable Long id) {
        // 获取当前登录用户
        Long userId = SecurityUtil.getCurrentUserId();
        if (userId == null) {
            return Result.error("用户未登录");
        }
        
        // 验证是否是自己的产品
        Product existingProduct = productService.getById(id);
        if (existingProduct == null) {
            return Result.error("产品不存在");
        }
        
        if (!existingProduct.getFarmerId().equals(userId)) {
            return Result.error("无权操作此产品");
        }
        
        boolean result = productService.unpublishProduct(id);
        if (!result) {
            return Result.error("下架产品失败");
        }
        return Result.success(true);
    }

    /**
     * 获取所有可购买的产品（针对买家）
     * 只显示农户的产品，排除肥料商的产品
     */
    @GetMapping("/market")
    public Result<List<ProductVO>> getAllProductsForMarket() {
        // 只获取农户的产品，排除肥料商的产品
        List<Product> products = productService.getAllActiveFarmerProducts();
        List<ProductVO> productVOList = products.stream()
            .map(this::convertToMarketVO)
            .collect(Collectors.toList());
        return Result.success(productVOList);
    }
    
    /**
     * 将产品实体转换为市场展示VO
     */
    private ProductVO convertToMarketVO(Product product) {
        ProductVO vo = new ProductVO();
        BeanUtils.copyProperties(product, vo);
        
        // 手动处理库存字段的转换，从BigDecimal转为Integer
        if (product.getStock() != null) {
            vo.setStock(product.getStock().intValue());
        } else {
            vo.setStock(0);
        }
        
        // 获取农户信息
        if (product.getFarmerId() != null) {
            User farmer = userService.getById(product.getFarmerId());
            if (farmer != null) {
                vo.setFarmerName(farmer.getNickname() != null ? farmer.getNickname() : farmer.getUsername());
                vo.setFarmerPhone(farmer.getPhone());
                // 获取农户评分
                Double rating = userService.getUserAverageRating(product.getFarmerId());
                vo.setFarmerRating(rating != null ? rating : 5.0);
            }
        }
        
        // 设置销量
        Integer salesCount = orderItemService.getProductSalesCount(product.getId());
        vo.setSalesCount(salesCount);
        
        return vo;
    }
} 